﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using Telerik.Web.UI;
using System.Collections;
using System.Text;
using Proxy;
using System.Web.Services;
using SIM.Util;

namespace SIM.Geo.UI.Geo
{
    public partial class frmActualizarUbicacionSondaje : PageBase
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            if (!IsPostBack)
            {
                this.rgLista.ClientSettings.Scrolling.ScrollHeight = int.Parse(System.Configuration.ConfigurationManager.AppSettings["listaPrincipalScrollHeight"]);
                this.chkSinUbicacion.Checked = true;
                CargarCombos();
                Listar();
            }
        }

        private void CargarCombos()
        {
            try
            {


                //Llena los combos de busqueda
                this.txtAnioBuscar.Text = DateTime.Today.Year.ToString();


                this.ddlEstadoBuscar.Items.Add(new ListItem(Constantes.TipoSeleccion.TODOS, TipoDropDownList.Todos.GetHashCode().ToString()));
                this.ddlEstadoBuscar.Items.Add(new ListItem(enmEstadoSondaje.Iniciado.ToString(), enmEstadoSondaje.Iniciado.GetHashCode().ToString()));
                this.ddlEstadoBuscar.Items.Add(new ListItem(enmEstadoSondaje.Finalizado.ToString(), enmEstadoSondaje.Finalizado.GetHashCode().ToString()));
                this.ddlEstadoBuscar.SelectedValue = enmEstadoSondaje.Iniciado.GetHashCode().ToString();

                using (SEZonaClient proxy = new SEZonaClient("BasicHttpBinding_ISEZona"))
                {
                    var zonas = proxy.ObtenerListItem().ToList();
                    this.Bind(this.ddlZonaBuscar, zonas);
                    this.ddlZonaBuscar.Items.Insert(0, new ListItem(Constantes.TipoSeleccion.TODOS, TipoDropDownList.Todos.GetHashCode().ToString()));
                }

                using (SECategoriaSondajeClient proxy = new SECategoriaSondajeClient("BasicHttpBinding_ISECategoriaSondaje"))
                {
                    var categorias = proxy.ObtenerListItem().ToList();
                    this.Bind(this.ddlCategoriaBuscar, categorias);
                    this.ddlCategoriaBuscar.Items.Insert(0, new ListItem(Constantes.TipoSeleccion.TODOS, TipoDropDownList.Todos.GetHashCode().ToString()));
                }

            }
            catch (Exception ex)
            {


                Logger.Error("frmActualizarUbiSondaje:CargarCombos", ex);
            }
        }

        #region Mensajes
        protected override void MostrarMensajeValidacion(string mensaje)
        {
            this.pnlMensajeValidacion.Visible = true;
            this.lblMensajeValidacion.Text = mensaje;
        }

        protected override void OcultarMensajeValidacion()
        {
            this.pnlMensajeValidacion.Visible = false;
            this.lblMensajeValidacion.Text = string.Empty;
        }

        protected override void MostrarMensaje(string mensaje, enmTipoMensajeMostrar tipoMensaje = enmTipoMensajeMostrar.Informativa)
        {
            this.pnlMensaje.Visible = true;
            this.lblMensaje.Text = mensaje;
            this.pnlMensaje.CssClass = this.ObtenerEstiloMensaje(tipoMensaje);
        }

        protected override void OcultarMensaje()
        {
            this.pnlMensaje.Visible = false;
            this.lblMensaje.Text = string.Empty;
        }

        #endregion

        protected override void Listar()
        {
            try
            {
                using (SESondajeClient proxy = new SESondajeClient("BasicHttpBinding_ISESondaje"))
                {
                    int ubicacion = (this.chkSinUbicacion.Checked) ? 1 : 0;
                    var lista = proxy.BuscarSondajePorUbicacion(this.txtAnioBuscar.Text, int.Parse(this.ddlZonaBuscar.SelectedValue.ToString()),
                        int.Parse(this.ddlEstadoBuscar.SelectedValue.ToString()), int.Parse(this.ddlCategoriaBuscar.SelectedValue.ToString()), ubicacion);
                    this.rgLista.DataSource = lista;

                    this.rgLista.DataBind();
                }

            }
            catch (Exception ex)
            {

                Logger.Error("frmActualizarUbiSondaje:Listar", ex);
            }
        }

        protected override void Guardar()
        {
            try
            {
                //Se valida antes de grabar
                StringBuilder sb = new StringBuilder();
                if (!this.Validar(ref sb))
                {
                    this.MostrarMensajeValidacion(sb.ToString());
                    return;
                }

                Sondaje sondaje = new Sondaje();
                sondaje.CodigoSondaje = int.Parse(this.hidCodigo.Value);
                sondaje.Norte = double.Parse(this.txtNorte.Text);
                sondaje.Este = double.Parse(this.txtEste.Text);
                sondaje.Cota = double.Parse(this.txtCota.Text);
                sondaje.Azimut = double.Parse(this.txtAzimut.Text);
                sondaje.Inclinacion = double.Parse(this.txtInclinacion.Text);

                using (SESondajeClient proxy = new SESondajeClient("BasicHttpBinding_ISESondaje"))
                {
                    proxy.ActualizarUbicacionSondaje(sondaje);
                }

                this.MostrarMensaje(MSG_OK_GRABAR);
                this.mpRegistro.Hide();
                this.Listar();

            }
            catch (Exception ex)
            {
                MostrarMensajeValidacion(MSG_ERROR_GRABAR);
                Logger.Error("frmActualizarUbiSondaje:Guardar", ex);
            }
        }

        private void CargarDatos(int codigoSondaje)
        {
            try
            {
                using (var proxy = new SESondajeClient("BasicHttpBinding_ISESondaje"))
                {
                    var item = proxy.ObtenerSondaje(codigoSondaje);
                    if (item != null)
                    {
                        this.hidCodigo.Value = item.CodigoSondaje.ToString();
                        this.txtNombreDDH.Text = item.NombreDDH;
                        this.txtSeccion.Text = item.Seccion.ToString();
                        this.hidCodigoZona.Value = item.CodigoZona.ToString();

                        if (item.CodigoLabor != null)
                        {
                            using (var proxyLabor = new SELaborClient("BasicHttpBinding_ISELabor"))
                            {
                                var labor = proxyLabor.Obtener((int)item.CodigoLabor);
                                if (labor != null) this.txtNombreLabor.Text = labor.NombreLabor;
                            }
                        }

                        this.txtEste.Text = item.Este.ToString();
                        this.txtNorte.Text = item.Norte.ToString();
                        this.txtCota.Text = item.Cota.ToString();
                        this.txtInclinacion.Text = item.Inclinacion.ToString();
                        this.txtAzimut.Text = item.Azimut.ToString();

                        //Verifico el estado y deshabilito el guardar
                        //if (item.Estado.CompareTo((short)enmEstadoSondaje.FINALIZADO.GetHashCode()) == 0)
                        //{
                        //    this.ibtnGuardar.Visible = false;
                        //    this.lblEstado.Text = enmEstadoSondaje.FINALIZADO.ToString();
                        //}
                        //else
                        //{
                        //    this.ibtnGuardar.Visible = true;
                        //    this.lblEstado.Text = enmEstadoSondaje.INICIADO.ToString();
                        //}
                    }
                }
            }
            catch (Exception ex)
            {

                Logger.Error("frmActualizarUbiSondaje:CargarDatos", ex);
            }
        }

        protected override bool Validar(ref  StringBuilder sb)
        {
            bool retorno = true;
            try
            {
                //Valida si el nombre ingresado ya existe, si solo es Nuevo
                double este = double.Parse(this.txtEste.Text);
                double norte = double.Parse(this.txtNorte.Text);
                double cota = double.Parse(this.txtCota.Text);

                using (SEZonaClient proxy = new SEZonaClient("BasicHttpBinding_ISEZona"))
                {
                    var zona = proxy.ObtenerZona(int.Parse(this.hidCodigoZona.Value));
                    using (SEUnidadMineraClient proxyUM = new SEUnidadMineraClient("BasicHttpBinding_ISEUnidadMinera"))
                    {
                        var unidadMinera = proxyUM.ObtenerUnidadMinera(zona.CodigoUnidad);
                        if (unidadMinera != null)
                        {
                            //Valido Este
                            if (este < unidadMinera.RangoInicialEste || este > unidadMinera.RangoFinalEste)
                            {
                                sb.AppendLine("Este está fuera de rango, rango permitido es " + unidadMinera.RangoInicialEste.ToString() + " al " + unidadMinera.RangoFinalEste.ToString());
                                retorno = false;
                            }
                            //Valido Norte
                            if (norte < unidadMinera.RangoInicialNorte || norte > unidadMinera.RangoFinalNorte)
                            {
                                sb.AppendLine("Norte está fuera de rango, rango permitido es " + unidadMinera.RangoInicialNorte.ToString() + " al " + unidadMinera.RangoFinalNorte.ToString());
                                retorno = false;
                            }

                            //Valida la Cota
                            if (cota < unidadMinera.RangoInicialCota || cota > unidadMinera.RangoFinalCota)
                            {
                                sb.AppendLine("Cota está fuera de rango, rango permitido es " + unidadMinera.RangoInicialCota.ToString() + " al " + unidadMinera.RangoFinalCota.ToString());
                                retorno = false;
                            }
                        }
                        else
                        {
                            sb.AppendLine("La Sección requiere definición de unidad minera. Defina los rangos de unidad minera");
                            retorno = false;
                        }
                    }

                    //Valido el Azimut debe ser rango 0 < 360
                    if (double.Parse(this.txtAzimut.Text) < 0 || double.Parse(this.txtAzimut.Text) >= 360)
                    {
                        sb.AppendFormat("El valor permitido para Azimut no es válido. Debe ser mayor igual que 0 y menor que 360");
                        retorno = false;
                    }
                }

            }
            catch (Exception ex)
            {
                retorno = false;
                Logger.Error("frmActualizarUbiSondaje:Validar", ex);
            }
            return retorno;
        }

        private void HabilitarUbicacion(bool estado = true)
        {
            this.txtEste.Enabled = estado;
            this.txtNorte.Enabled = estado;
            this.txtCota.Enabled = estado;
            this.txtInclinacion.Enabled = estado;
            this.txtAzimut.Enabled = estado;

            //this.ibtnAutocad.Visible = estado;
            this.ibtnInclinacion.Visible = estado;
            this.ibtnAzimut.Visible = estado;

            this.ibtnGuardar.Visible = estado;
        }

        protected void imgClose_Click(object sender, ImageClickEventArgs e)
        {
            this.mpRegistro.Hide();
        }

        protected void rgLista_ItemCommand(object sender, GridCommandEventArgs e)
        {
            if (e.CommandName.CompareTo("Editar") == 0)
            {
                var item = (GridEditableItem)e.Item;
                int codigoSondaje = int.Parse(item.GetDataKeyValue("CodigoSondaje").ToString());
                //Carga detalle de sondaje
                this.CargarDatos(codigoSondaje);
                HabilitarUbicacion(true);
                this.txtNombreDDH.Enabled = false;
                this.txtNombreLabor.Enabled = false;
                this.txtSeccion.Enabled = false;

                OcultarMensaje();
                OcultarMensajeValidacion();
                this.mpRegistro.Show();
            }

            if (e.CommandName.CompareTo("Ver") == 0)
            {
                var item = (GridEditableItem)e.Item;
                int codigoSondaje = int.Parse(item.GetDataKeyValue("CodigoSondaje").ToString());
                //Carga detalle de sondaje
                this.CargarDatos(codigoSondaje);
                HabilitarUbicacion(false);
                this.txtNombreDDH.Enabled = false;
                this.txtNombreLabor.Enabled = false;
                this.txtSeccion.Enabled = false;

                OcultarMensaje();
                OcultarMensajeValidacion();
                this.mpRegistro.Show();
            }

            if (e.CommandName == RadGrid.FilterCommandName)
            {
                Listar();
            }
        }

        protected void ibtnBuscar_Click(object sender, ImageClickEventArgs e)
        {
            this.Listar();
        }

        protected void ibtnExportar_Click(object sender, ImageClickEventArgs e)
        {
            try
            {
                Listar();
                string alternateText = "ExcelML";
                this.rgLista.ExportSettings.Excel.Format = (GridExcelExportFormat)Enum.Parse(typeof(GridExcelExportFormat), alternateText);
                this.rgLista.ExportSettings.IgnorePaging = true;
                this.rgLista.ExportSettings.ExportOnlyData = true;
                this.rgLista.ExportSettings.OpenInNewWindow = true;
                this.rgLista.MasterTableView.ExportToExcel();
            }
            catch (Exception ex)
            {

                Logger.Error("frmActualizarUbiSondaje:ibtnExportar_Click", ex);
            }
        }

        protected void ibtnGuardar_Click(object sender, ImageClickEventArgs e)
        {
            this.Guardar();
        }

        protected void ibtnCancelar_Click(object sender, ImageClickEventArgs e)
        {
            this.mpRegistro.Hide();
        }

        protected void rgLista_PageIndexChanged(object sender, GridPageChangedEventArgs e)
        {
            Listar();
        }

        protected void rgLista_SortCommand(object sender, GridSortCommandEventArgs e)
        {
            Listar();
        }

        protected void rgLista_PageSizeChanged(object sender, GridPageSizeChangedEventArgs e)
        {
            this.Listar();
        }

        protected void rgLista_ItemDataBound(object sender, GridItemEventArgs e)
        {
            try
            {
                if (e.Item.ItemType == GridItemType.Item || e.Item.ItemType == GridItemType.AlternatingItem)
                {
                    GridDataItem item = (GridDataItem)e.Item;
                    string codigoEstado = ((GridDataItem)e.Item).GetDataKeyValue("Estado").ToString();
                    if (codigoEstado.CompareTo(enmEstadoSondaje.Finalizado.GetHashCode().ToString()) == 0)
                    {
                        ImageButton btnEditar = (ImageButton)item["btnEditar"].Controls[0];
                        btnEditar.ToolTip = BUTTON_TOOLTIP_DESHABILITADO;
                        btnEditar.Enabled = false;
                    }
                }
            }
            catch (Exception ex)
            {

                Logger.Error("frmActualizarUbiSondaje:rgLista_ItemDataBound", ex);

            }
        }

        private void LimpiarHora()
        {
            this.txtGrados.Text = "0";
            this.txtMinutos.Text = "0";
            this.txtSegundos.Text = "0";
        }

        protected void ibtnInclinacion_Click(object sender, ImageClickEventArgs e)
        {
            LimpiarHora();
            //Setea validacion de Horas
            this.txtGrados.MinValue = -90;
            this.txtGrados.MaxValue = 90;
            this.rvGrados.MaximumValue = "90";
            this.rvGrados.MinimumValue = "-90";
            this.rvGrados.ErrorMessage = "Rango permitido es [-90 a 90]";
            if (this.txtInclinacion.Text.Length > 0)
            {
                Grado grado = null;
                using (var proxy = new SEGradoClient("BasicHttpBinding_ISEGrado"))
                {
                    grado = proxy.ConvertirAHoras(double.Parse(this.txtInclinacion.Text));
                    this.txtGrados.Text = grado.Grados.ToString();
                    this.txtMinutos.Text = grado.Minutos.ToString();
                    this.txtSegundos.Text = grado.Segundos.ToString();
                }
            }
            this.lblHora.Text = "INCLINACIÓN";
            this.hidOpcionHora.Value = "Inc";
            this.mpHora.Show();
        }

        protected void ibtnAzimut_Click(object sender, ImageClickEventArgs e)
        {
            try
            {

                LimpiarHora();
                this.txtGrados.MinValue = 0;
                this.txtGrados.MaxValue = 359;
                this.rvGrados.MaximumValue = "359";
                this.rvGrados.MinimumValue = "0";
                this.rvGrados.ErrorMessage = "Rango permitido es [0 a 359]";
                if (this.txtAzimut.Text.Length > 0)
                {
                    Grado grado = null;
                    using (var proxy = new SEGradoClient("BasicHttpBinding_ISEGrado"))
                    {
                        grado = proxy.ConvertirAHoras(double.Parse(this.txtAzimut.Text));
                        this.txtGrados.Text = grado.Grados.ToString();
                        this.txtMinutos.Text = grado.Minutos.ToString();
                        this.txtSegundos.Text = grado.Segundos.ToString();
                    }
                }
                this.lblHora.Text = "AZIMUT";
                this.hidOpcionHora.Value = "Azi";
                this.mpHora.Show();

            }
            catch (Exception ex)
            {

                Logger.Error("ibtnAzimut_Click:ibtnOk_Click", ex);
            }
        }

        protected void ibtnOk_Click(object sender, ImageClickEventArgs e)
        {
            try
            {
                int grados = int.Parse(this.txtGrados.Text);
                int minutos = int.Parse(this.txtMinutos.Text);
                int segundos = int.Parse(this.txtSegundos.Text);

                Grado grado = new Grado()
                {
                    Grados = grados,
                    Minutos = minutos,
                    Segundos = segundos
                };

                string Ubicacion = this.lblTituloHora.Text;
                Grado gradovalor = null;

                using (var proxy = new SEGradoClient("BasicHttpBinding_ISEGrado"))
                {
                    gradovalor = proxy.ConvertirAGrados(grado);
                }

                if (this.hidOpcionHora.Value.CompareTo("Inc") == 0)
                {

                    this.txtInclinacion.Text = gradovalor.Angulo.ToString();
                }
                else
                {

                    this.txtAzimut.Text = gradovalor.Angulo.ToString();
                }

                this.mpHora.Hide();

            }
            catch (Exception ex)
            {

                Logger.Error("frmActualizarUbiSondaje:ibtnOk_Click", ex);
            }
        }

        protected void ibtnCancel_Click(object sender, ImageClickEventArgs e)
        {
            this.mpHora.Hide();
        }
    }
}